package org.jkuang.qstar.index.filter;

import java.nio.charset.Charset;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeSet;

import org.jkuang.qstar.commons.jni.CurMap;
import org.jkuang.qstar.index.dic.TermsDic;
import org.jkuang.qstar.index.store.DataNode;

/**
 * 
 * @author jkuang 2018年12月19日
 * 
 *         如果两条数据的返回字段一抹一样，则消重重复（保证同一页上的数据 内容不相同）
 *
 */
public class RepeatFilter implements ResultFilter {

	private static Charset charset = Charset.forName("utf8");

	LinkedHashMap<Long, byte[]> map = new LinkedHashMap<>();
	
	TreeSet<byte[]> set = new TreeSet<byte[]>(new ByteArrayComparator());

	@Override
	public boolean accept(final DataNode node, final TermsDic dic, final CurMap store) {
		byte[] doc = store.get(node.key());
		if (set.contains(doc)) {
			return false;
		} else {
			map.put(node.key(), doc);
			set.add(doc);
			return true;
		}
	}

	/**
	 * 用于判定数据是否相同
	 * 
	 * @author jkuang 2018年12月19日
	 *
	 */
	static class ByteArrayComparator implements Comparator<byte[]> {
		@Override
		public int compare(byte[] o1, byte[] o2) {
			if (o1.length != o2.length) {
				return o1.length - o2.length;
			}
			for (int i = 0; i < o2.length; i++) {
				if (o1[i] == o2[i]) {
					continue;
				} else if (o1[i] > o2[i]) {
					return 1;
				} else {
					return -1;
				}
			}
			return 0;
		}
	}

	@Override
	public void print() {
		for (Map.Entry<Long, byte[]> entry : map.entrySet()) {
			System.out.println("key:" + entry.getKey() + " value:" + new String(entry.getValue(), charset));
		}
	}

	@Override
	public Map<Long, byte[]> result() {
		// TODO Auto-generated method stub
		return map;
	}
}